#include "monstre.h"

monstre* creerMonstre(int num,char dir,int type,int x,int y,int niv,int ter,int vie)
{
    monstre* mon;
    mon=new(monstre);///on crée un monstre
    initMonstre(mon,num,dir,type,x,y,niv,ter,vie);/// et on l'initialise
    return mon;
}

void initMonstre(monstre* mon,int num,char dir,int type,int x,int y,int niv,int ter,int vie)
{
    monstreSetNum(mon,num);/// On lui attribut un numéro,
    monstreSetDirection(mon,dir);/// une direction,
    monstreSetType(mon,type);///un type,
    monstreSetX(mon,x);///une position en x
    monstreSetY(mon,y);///et en y,
    monstreSetNiv(mon,niv);///un numéro de niveau sur lequel se balader
    monstreSetTer(mon,ter);///et un numéro de terrain
    monstreSetVie(mon,vie);///ainsi qu'un nombre de points de vie
}

void supprimeMonstre(monstre* mon)
{
    delete(mon);
}

void afficheMonstre(monstre* mon)
{
    cout<<"numero: "<<monstreGetNum(mon)<<endl;///on affiche son numéro,
    cout<<"direction: ";///sa "direction",
        switch(monstreGetDirection(mon))
            {
                case 'g':
                    {cout<<"horizontale commençant à gauche"<<endl;}
                    break;
                case 'd':
                    {cout<<"horizontale commençant par la droite"<<endl;}
                    break;
                case 'h':
                    {cout<<"verticale commençant par le haut"<<endl;}
                    break;
                case 'b':
                    {cout<<"verticale commençant par le bas"<<endl;}
            }
    cout<<"type: "<<monstreGetType(mon)/*il faudrait penser à donner un nom au type*/<<endl;///son type,
    cout<<"X: "<<monstreGetX(mon)<<endl;///sa position en x,
    cout<<"Y: "<<monstreGetY(mon)<<endl;///en y,
    cout<<"niveau: "<<monstreGetNiv(mon)<<endl;///le numéro du niveau sur lequel il se trouve,
    cout<<"terrain: "<<monstreGetTer(mon)<<endl;///et le numéro du terrain
}

int monstreGetNum(const monstre* mon)
{
    return mon->num;
}

char monstreGetDirection(const monstre* mon)
{
    return mon->direction;
}

int monstreGetType(const monstre* mon)
{
    return mon->type;
}

int monstreGetX(const monstre* mon)
{
    return mon->x;
}

int monstreGetY(const monstre* mon)
{
    return mon->y;
}

int monstreGetNiv(const monstre* mon)
{
    return mon->niv;
}

int monstreGetTer(const monstre* mon)
{
    return mon->ter;
}

void monstreSetNum(monstre* mon, int num)
{
    mon->num=num;
}

void monstreSetDirection(monstre* mon, char dir)
{
    mon->direction=dir;
}

void monstreSetType(monstre* mon, int type)
{
    mon->type=type;
}

void monstreSetX(monstre* mon, int x)
{
    mon->x=x;
}

void monstreSetY(monstre* mon, int y)
{
    mon->y=y;
}

void monstreSetNiv(monstre* mon, int niv)
{
    mon->niv=niv;
}

void monstreSetTer(monstre* mon, int ter)
{
    mon->ter=ter;
}

void monstreDroite(monstre* mon,const Terrain* ter)
{
    if(terPosHeroOk(ter,monstreGetX(mon)+1,monstreGetY(mon))!=0 &&/**On teste si il y a un obstacle à droite du monstre*/
       terPosHeroOk(ter,monstreGetX(mon)+1,monstreGetY(mon)+1)!=1 &&
       terPosHeroOk(ter,monstreGetX(mon)+1,monstreGetY(mon))!=6)
    {///si non, on le deplace de 1 à droite
        monstreSetX(mon,monstreGetX(mon)+1);
    }
    else
    {///sinon le monstre par dans l'autre sens
        monstreSetDirection(mon,'g');
    }
}

void monstreGauche(monstre* mon,const Terrain* ter)
{
    if(terPosHeroOk(ter,monstreGetX(mon)-1,monstreGetY(mon))!=0 &&/**On teste s'il y a un obstable à gauche du monstre*/
       terPosHeroOk(ter,monstreGetX(mon)-1,monstreGetY(mon)+1)!=1 &&
       terPosHeroOk(ter,monstreGetX(mon)-1,monstreGetY(mon))!=6)
    {///si non, on le deplace de 1 à gauche
        monstreSetX(mon,monstreGetX(mon)-1);
    }
    else
    {///sinon le monstre part dans l'autre sens
        monstreSetDirection(mon,'d');
    }
}

void monstreHaut(monstre* mon,const Terrain* ter)
{
    if(terPosHeroOk(ter,monstreGetX(mon),monstreGetY(mon)-1)!=0)///On teste s'il y a un obstacle au dessus du monstre
    {///si non, on le deplace de 1 en haut
        monstreSetY(mon,monstreGetY(mon)-1);
    }
    else
    {///sinon le monstre part dans l'autre sens
        monstreSetDirection(mon,'b');
    }
}

void monstreBas(monstre* mon,const Terrain* ter)
{
    if(terPosHeroOk(ter,monstreGetX(mon),monstreGetY(mon)+1)!=0)///On teste s'il y a un obstacle en dessous du monstre
    {///si non, on le deplace de 1 en bas
        monstreSetY(mon,monstreGetY(mon)+1);
    }
    else
    {///sinon le monstre change de sens
        monstreSetDirection(mon,'h');
    }
}

void deplacementMonstre(monstre* mon,const Terrain* ter)
{
    switch(monstreGetDirection(mon))
    {
        case 'd':
            monstreDroite(mon,ter);
            break;
        case 'g':
            monstreGauche(mon,ter);
            break;
        case 'h':
            monstreHaut(mon,ter);
            break;
        case 'b':
            monstreBas(mon,ter);
            break;
    }
}

int monstreGetVie(const monstre* mon)
{
	return mon->vie;
}

void monstreSetVie(monstre* mon, int vie)
{
	mon->vie=vie;
}
